﻿/* ----------------------------------------------------------------------------------------------------
 * Project Name: FUHCM Learning Tracker
 * Version: 1.1
 * Date Updated: 22/09/2012
 * Author: nhannvse60650, quannmse60665, hainh
 * Feature:
 *          + Version 1: Check Attendance For FU HCM
 *          + Version 1.1 Add Upcoming event and absent day
 * 
 * Change logs:
 *          + 20/09/2012 : Restructure all the code, add more auto get page feature
 *          + 21/09/2012 : Add Upcoming Event, Absent day, change appearance
 *          + 22/09/2012 : 
 *                  - Restruct code again
 *                  - optimize code to meet highest performance
 *                  - fix important bug (break program when don't meet require)
 *                  - higher speed to load info
 *-----------------------------------------------------------------------------------------------------*/
using System;
using System.Windows.Forms;
using System.Net;
using System.IO;
using HtmlAgilityPack;
using System.Collections;
using System.Text;
using System.ComponentModel;
using System.Threading;


namespace DiemDanh
{
    public partial class Form1 : Form
    {
        Attendance attForm;//form hiển thị thông tin attendance
        internal ArrayList result = new ArrayList();//array list chứa kết quả sau khi request
        ArrayList subName = new ArrayList();//array list chứa tên các môn học
        ArrayList pageID = new ArrayList();//array list chứa pageID của trang attendance
        ArrayList subjectsList = new ArrayList();//array list chứa các môn học
        ArrayList categoriesList = new ArrayList();//array list chứa tất cả các học phần
        internal CookieContainer cookies = null;// chứa cookies sau khi đăng nhập
        internal string userFullName = "";
        internal string selectedSubjectName = "";
        public Form1()
        {
            InitializeComponent();
            this.txtPassword.PasswordChar = '*';
            prepareData();
            loadCategories();
        }

        /* @user: Nhan
         * @para:default
         * @definition: Lấy thông tin sau đó hiển thị ra
         * @return: none
         */
        private void btnSubmit_Click(object sender, EventArgs e)
        {
            string subjectName = this.cbbSubject.Text;
            attForm = new Attendance(this, subjectName);
            attForm.Show();//create new thread!
        }
        /* @user: Nhan
         * @para: none
         * @definition: validate Input để đăng nhập và lấy thông tin
         * @return: [bool]
         */
        private bool validateSubmit()
        {
            string username = this.txtUsername.Text.Trim();
            string password = this.txtPassword.Text.Trim();
            string sub = this.cbbSubject.Text;
            if (username.Equals("") || password.Equals("") || sub.Equals(""))
            {
                MessageBox.Show("CHÚ Ý: \nBẠN CẦN NHẬP THÔNG TIN ĐĂNG NHẬP VÀO CMS VÀ CHỌN MÔN HỌC!");
                return false;
            } 
            return true;
        }

        /* @user: Nhan
         * @para:[string] username, [string] password, [string] pageID
         * @definition: Login Lấy Cookies
         * @return: [CookieContainer] cookies của lần đăng nhập hiện tại
         */
        //mục đích chính là trả về array list kết quả cần tìm, lấy từ Website chứa các thông tin trong bảng attendance (table class = "list" )
        internal CookieContainer doLogin(string username, string password)
        {
            HttpWebRequest webRequest;// tao doi tuong http request
            CookieContainer cookies = null;//cookies de chua thong tin dang nhap dung xuot chuong trinh
            
            //Đăng nhập CMS
            webRequest = WebRequest.Create("http://cms-hcm.fpt.edu.vn/elearning/login/index.php") as HttpWebRequest;

            // chuẩn bị cookie để lưu thông tin đăng nhập thành công
            cookies = new CookieContainer();
            webRequest.Method = "POST"; //post method!
            webRequest.ContentType = "application/x-www-form-urlencoded";//cái này trong msdn nó hướng dẫn
            webRequest.CookieContainer = cookies; //dùng cookie vừa chuẩn bị để chứa thông tin đăng nhập hiện tại
            string postData = "username=" + username + "&password=" + password;//thông tin cần truyền vào form, lấy theo name attribute!

            //truyền dữ liệu vào form đăng nhập 
            StreamWriter requestWriter = new StreamWriter(webRequest.GetRequestStream());
            requestWriter.Write(postData); //submit!
            requestWriter.Close();

            //hoàn tất việc lấy cookie, đóng response luôn 
            //nếu muốn lấy dữ liệu từ trang này thì lấy từ thằng response bên dưới = StreamReader, không thì close(); 
            StreamReader responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
            string responseData = responseReader.ReadToEnd(); //kết quả là HTML string được lưu lại ở biến responseData;
            if (responseData.IndexOf("Login to the site") != -1)
            {
                MessageBox.Show("ERROR!\nSAI THÔNG TIN ĐĂNG NHẬP\nVUI LÒNG GÕ ĐÚNG USERNAME VÀ PASSWORD LOGIN VÀO CMS");
                cookies = null;
            }
            responseReader.Close();
            webRequest.GetResponse().Close();

            return cookies;
        }

        /* @user: Nhan
         * @para: none
         * @definition: load subject từ text file tạo thành một danh sách arrayList các object subject
         * @return: none
         */
        private void prepareData()
        {
            StreamReader srd = new StreamReader("topics.txt");
            string str = "";
            while (!srd.EndOfStream)
            {
                str += srd.ReadToEnd();
            }
            str = str.Replace("\r\n\t", "").Replace("\r", "").Replace("\n", "").Replace("\t", "");
            string[] categoriesSubject = str.Split('|');

            //lấy được tên học phần và các môn học trong đó 
            foreach (string category in categoriesSubject)
            {
                //sau đó phân ra học phần [0], các môn học trong học phần đó [1]
                string[] catAndSubject = category.Split(';');
                //cắt lấy phần category, lưu lại để dùng sau
                string catName = catAndSubject[0];
                this.categoriesList.Add(catName);

                //cắt lấy phần môn học
                string subjectsInCat = catAndSubject[1];
                //lấy thông tin từng môn trong học phần: tên môn và page ID
                string[] subjects = subjectsInCat.Split('.');
                
                //lấy thông tin của từng môn học
                foreach (string subject in subjects)
                {
                    if (!subject.Equals(""))
                    {

                        string[] subjectInfo = subject.Split(',');
                        string subName = subjectInfo[0];
                        string subPageID = subjectInfo[1];
                        this.subjectsList.Add(new subject(catName, subName, subPageID));
                    }
                }
            }
        }//end prepareData();

        /* @user: Nhan
         * @para: none
         * @definition: load categories tạo thành combobox để lọc môn học
         */
        private void loadCategories()
        {
            this.cbbCategories.DataSource = this.categoriesList;
        }

        /* @user: Nhan
         * @para: default event parameter
         * @definition: Hiển thị môn học theo học phần được chọn, trigger khi index thay đổi
         * return: none
         */
        private void cbbCategories_SelectedIndexChanged(object sender, EventArgs e)
        {
            int cateIndex = this.cbbCategories.SelectedIndex;
            string selectedCatName = this.categoriesList[cateIndex].ToString();
            //lọc các môn theo category đã chọn
            ArrayList filteredSubs = subjectFiltered(selectedCatName);
            //gán vào trong cbb môn học
            this.cbbSubject.DataSource = filteredSubs;
        }

        /* @user: Nhan
         * @para: [string] selectedCategory
         * @definition: Lọc các môn học theo category
         * @return: ArrayList các môn học trong category
         */
        private ArrayList subjectFiltered(string selectedCategory)
        {
            ArrayList subjects = new ArrayList();
            foreach (subject sub in this.subjectsList)
            {
                if(sub.catSubject.Equals(selectedCategory))
                {
                    subjects.Add(sub.subjectName);
                }
            }
            return subjects;
        }//end subjectFiltered();

        /* @user: Nhan
         * @para:[string] selectedSubject
         * @definition: Lấy PageID của môn được chọn
         * @return: [string] pageID của môn học
         */
        public string getPageID(string selectedSubject) 
        {
            string pageID = "";
            foreach (subject sub in subjectsList)
            {
                if (sub.subjectName.Equals(selectedSubject)) pageID = sub.subjectPageID;
            }
            return pageID;
        }
    }
}
